#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>


void PrintSignal()
{
    sigset_t set, oldset;
    sigemptyset(&set);
    sigpending(&set);
    std::cout << "pending：";
    for (int i =  1; i < 32; i++)
        if(sigismember(&set, i))
            putchar('1');
        else
            putchar('0');
    putchar('\n');

    std::cout << "block：";
    sigemptyset(&set);
    sigprocmask(SIG_BLOCK, &set, &oldset);
    for (int i = 1; i < 32; i++)
        if(sigismember(&oldset, i))
            putchar('1');
        else
            putchar('0');
    putchar('\n');

}

void HandlerSIGCHLD(int signo)
{
    int status;
    while(true)
    {
        pid_t rid = waitpid(-1, &status, WNOHANG);
        if(rid > 0)
        {
            std::cout << "wait child pid : " << rid << " success\n";
        }
        else
            break;
    }
}

int main()
{
    // signal(SIGCHLD, HandlerSIGCHLD);
    signal(SIGCHLD, SIG_IGN);
    for (int i = 0; i < 100; i++)
    {
        pid_t id = fork();
        if(id == 0)
        {
            int cnt = 6;
            while(cnt--)
                sleep(1);
            exit(i);
        }
    }
    while(true)
        sleep(1);
    return 0;
}

// void HandlerSignal(int signo)
// {
//     std::cout << "handler a signo : " << signo << std::endl;
//     PrintSignal();
// }

// int main()
// {
//     std::cout << getpid() << std::endl;
//     struct sigaction sig;
//     sig.sa_handler = HandlerSignal;
//     sig.sa_flags = 0;
//     sigemptyset(&sig.sa_mask);
//     for (int i = 1; i <= 5; i++)
//         sigaddset(&(sig.sa_mask), i);

//     sigaction(2, &sig, nullptr);

//     while(true)
//     {
//         sleep(2);
//         PrintSignal();
//     }

//     return 0;
// }

// int main()
// {
//     std::cout << getpid() << std::endl;
//     sigset_t newset;
//     sigfillset(&newset);
//     sigprocmask(SIG_SETMASK, &newset, nullptr);
//     while(true)
//     {
//         sigset_t set;
//         sigemptyset(&set);
//         sigpending(&set);
//         for (int i = 1; i < 32; i++)
//             if(sigismember(&set, i))
//                 std::cout << '1';
//             else
//                 std::cout << '0';
//         std::cout << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// void HandlerSignal(int signo)
// {
//     std::cout << "handler a signo :" << signo << std::endl;
//     sigset_t set;
//     sigemptyset(&set);
//     sigpending(&set);
//     for (int i = 1; i < 32; i++)
//     {
//         if(sigismember(&set, i))
//             std::cout << 1;
//         else
//             std::cout << 0;
//     }
//     std::cout << '\n';
// }

// int main()
// {
//     sigset_t newset;
//     sigemptyset(&newset);
//     sigaddset(&newset, SIGINT);

//     sigprocmask(SIG_BLOCK, &newset, nullptr);

//     while(true)
//     {
//         sleep(1);
//         sigset_t set;
//         sigemptyset(&set);
//         sigpending(&set);
//         for (int i = 1; i < 32; i++)
//             if(sigismember(&set, i))
//                 std::cout << 1;
//             else
//                 std::cout << 0;
//         std::cout << std::endl;
//     }

//     return 0;
// }

// //读端不读且关闭读端，写端再写，就会触发SIGPIPE信号
// int main()
// {
//     pid_t id = fork();
//     int fdArr[2] = {0};
//     pipe(fdArr);
//     if (id == 0)
//     {
//         ::close(fdArr[0]);
//         signal(SIGPIPE, HandlerSignal);
//         sleep(10);
//         for (int i = 0; ; i++)
//         {
//             std::cout << "i : " << i << std::endl;
//             write(fdArr[1], &i, sizeof i);
//         }
//         exit(1);
//     }
//     ::close(fdArr[1]);
//     int cnt = 5;
//     while (cnt--)
//         sleep(1);
//     ::close(fdArr[0]);
//     std::cout << "close read....\n";

//     return 0;
// }

// void HandlerSignal(int signo)
// {
//     std::cout << "handler a signo :" << signo << std::endl;
//     exit(1);
// }

// int main()
// {
//     signal(SIGFPE, HandlerSignal);
//     signal(SIGSEGV, HandlerSignal);
//     // int a = 5 / 0;
//     char* str = "hello world";
//     str[0] = 'a';
//     return 0;
// }

// int i = 0;
// void HandlerSignal(int signo)
// {
//     std::cout << "hander signo : " << signo << ", i : " << i << std::endl;
//     i = 0;
//     alarm(1);
// }

// int main()
// {
//     signal(SIGALRM, HandlerSignal);
//     alarm(1);
//     while(true)
//     {
//         i++;
//     }
//     return 0;
// }

// int main()
// {
//     signal(2, HandlerSignal);
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout <<
//     }
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //child
//         signal(2, HandlerSignal);
//         while(true)
//         {
//             std::cout << "I am child process" << std::endl;
//             sleep(1);
//         }
//     }
//     sleep(5);
//     kill(id, 2);
//     return 0;
// }

// void HandlerSignal(int signo)
// {
//     std::cout << "hander no.2 sign" << std::endl;
// }

// int main()
// {
//     signal(2, HandlerSignal);
//     while(true)
//         sleep(1);
//     return 0;
// }
